﻿
#include "Engine/common.h"
#include "Engine/uimgr.h"
#include "Engine/ControlDef.h"
#include "strid.h"
#include "DNF定义.h"
#include "设置模块.h"
#include "AppUI.h"


//684*1050
const int 总宽度=条件面板宽度;

//横向左右各空20像素
//CheckBox例外，宽度和字数有关
const int 控件列宽=总宽度/3;

//控件高度固定，但图标选择框的图标高度28
const int 选择框高度=20;
const int 下拉列表高度=24;
const int 图标下拉列表高度=38;

//上下各空5像素
const int 选择框行高=选择框高度+10;
const int 图标选择框行高=通用图标宽高+10;
const int 下拉列表行高=下拉列表高度+10;
const int 图标下拉列表行高=图标下拉列表高度+10;

static int NextX=0;
static int NextY=0;
static int LastLineHeight=0;
CImage* Ctrl条件面板;

int 设置变更回调(UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2);

void 小块结束填充(int SpaceHeight)
{
	NextY+=LastLineHeight;
	NextY+=SpaceHeight;
}

void 创建选择框(int SettingIndex,int CtrlId,int NX)
{
	NextX=NX*控件列宽;
	SetCreateControlParam(NextX+20,NextY+5,Ctrl条件面板,PageId_Setting);
	CCheckBox* Ctrl选择框=EasyCreateCheckBox(CtrlId,NULL);
	Ctrl选择框->SetTextColor(0xFF000000);
	Ctrl选择框->SetUserData((PVOID)SettingIndex);
	Ctrl选择框->SetEventHandler(设置变更回调);
	LastLineHeight=选择框行高;
	if (NX==2)
	{
		NextY+=选择框行高;
		LastLineHeight=0;
	}
}

void 创建图标选择框(int SettingIndex,int CtrlId,int ImgCtrlId,int ResId,int NX)
{
	NextX=NX*控件列宽;
	SetCreateControlParam(NextX+20,NextY+5,Ctrl条件面板,PageId_Setting);
	EasyCreateImage(ImgCtrlId,通用图标宽高,通用图标宽高,ResId,IT_Bitmap);
	//图标宽28，中间空8
	SetCreateControlParam(NextX+20+通用图标宽高+8,NextY+5+(通用图标宽高-选择框高度)/2,Ctrl条件面板,PageId_Setting);
	CCheckBox* Ctrl选择框=EasyCreateCheckBox(CtrlId,NULL);
	Ctrl选择框->SetTextColor(0xFF000000);
	Ctrl选择框->SetUserData((PVOID)SettingIndex);
	Ctrl选择框->SetEventHandler(设置变更回调);
	LastLineHeight=图标选择框行高;
	if (NX==2)
	{
		NextY+=图标选择框行高;
		LastLineHeight=0;
	}
}

void 创建下拉列表(int SettingIndex,int CtrlId,int NX)
{
	NextX=NX*控件列宽;
	SetCreateControlParam(NextX+20,NextY+5,Ctrl条件面板,PageId_Setting);
	CDropList* Ctrl下拉列表=EasyCreateDropList(CtrlId,控件列宽-20-20,FALSE);
	Ctrl下拉列表->SetUserData((PVOID)SettingIndex);
	Ctrl下拉列表->SetEventHandler(设置变更回调);
	LastLineHeight=下拉列表行高;
	if (NX==2)
	{
		NextY+=下拉列表行高;
		LastLineHeight=0;
	}
}

void 创建图标下拉列表(int SettingIndex,int CtrlId,int NX)
{
	NextX=NX*控件列宽;
	SetCreateControlParam(NextX+20,NextY+5,Ctrl条件面板,PageId_Setting);
	CDropList* Ctrl下拉列表=EasyCreateDropList(CtrlId,控件列宽-20-20,TRUE);
	Ctrl下拉列表->SetUserData((PVOID)SettingIndex);
	Ctrl下拉列表->SetEventHandler(设置变更回调);
	LastLineHeight=图标下拉列表行高;
	if (NX==2)
	{
		NextY+=图标下拉列表行高;
		LastLineHeight=0;
	}
}

//只有修炼道场才有挑战沙袋，禁用冲突项
//默认值是修炼道场+普通沙袋，不会冲突
//修炼道场的Index为0，挑战沙袋的Index为1
void 选择场景冲突检查(int Index)
{
	CDropList* Ctrl怪物=EasyFindControl<CDropList>(PageId_Setting,CID_条件_怪物);
	if (Index!=0)
		Ctrl怪物->EnableItem(1,FALSE);
	else
		Ctrl怪物->EnableItem(1,TRUE);
}

void 选择怪物冲突检查(int Index)
{
	CDropList* Ctrl场景=EasyFindControl<CDropList>(PageId_Setting,CID_条件_场景);
	if (Index==1)
	{
		Ctrl场景->EnableItem(1,FALSE);
		Ctrl场景->EnableItem(2,FALSE);
	}
	else
	{
		Ctrl场景->EnableItem(1,TRUE);
		Ctrl场景->EnableItem(2,TRUE);
	}
}

int 设置变更回调(UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)
{
	if (UI_AdjustState!=0)
		return 0;
	//条件面板的控件全部基于索引，直接修改即可
	//CheckBox的Param1为是否选中，等价于索引1或0
	if (UIEvent==EvtCheckBoxChange || UIEvent==EvtSelectChange)
	{
		int SettingIndex=(int)CtrlObj->GetUserData();
		int SelIndex=(int)Param1;
		UI_AdjustState++;
		if (SettingIndex==设置_场景)
		{
			选择场景冲突检查(SelIndex);
			CImage* Ctrl伤害详情背景=EasyFindControl<CImage>(PageId_DamageDetail,CID_伤害详情_底图);
			Ctrl伤害详情背景->SetImage(EasyLoadImageR(RID_伤害详情背景_修炼道场+SelIndex));
			//场景后面的标签是系统奶，每次计算后由UpdateCalcResult()更新
			CImage* Ctrl场景图标=EasyFindControl<CImage>(PageId_DamageDetail,CID_伤害详情_场景图标);
			Ctrl场景图标->SetImage(EasyLoadImageR(RID_场景图标+SelIndex));
		}
		else if (SettingIndex==设置_怪物)
		{
			选择怪物冲突检查(SelIndex);
			CImage* Ctrl怪物图标=EasyFindControl<CImage>(PageId_DamageDetail,CID_伤害详情_怪物图标);
			Ctrl怪物图标->SetImage(EasyLoadImageR(RID_怪物图标+SelIndex));
			CLineLabel* Ctrl怪物标签=EasyFindControl<CLineLabel>(PageId_DamageDetail,CID_伤害详情_怪物标签);
			Ctrl怪物标签->SetText(怪物文本[SelIndex]);
		}
		UI_AdjustState--;
		ChangeSettingByUI_Index(SettingIndex,SelIndex);
		SubmitSettingChange();
	}
	return 0;
}


void 详细构建_条件面板(int PageId,CImage* Ctrl条件面板)
{
	::Ctrl条件面板=Ctrl条件面板;
	
	NextX=0;
	NextY=0;
	LastLineHeight=0;

	小块结束填充(8);
	创建图标下拉列表(设置_场景,CID_条件_场景,0);
	创建图标下拉列表(设置_怪物,CID_条件_怪物,1);
	小块结束填充(8);
	for (int i=0;i<DNF药剂总数;i++)
		创建图标选择框(设置_药剂1+i,CID_条件_药剂+i,CID_条件_药剂图标+i,RID_药剂图标+i,i%3);
	小块结束填充(8);

	for (int i=0;i<4;i++)
		创建下拉列表(设置_出血触发频率+i,CID_条件_出血触发频率+i,i%3);
	小块结束填充(0);
	for (int i=0;i<3;i++)
		创建下拉列表(设置_出血层数+i,CID_条件_出血层数+i,i%3);
	小块结束填充(0);
	创建下拉列表(设置_控制型异常开关,CID_条件_控制型异常开关,0);
	创建下拉列表(设置_控制型异常触发频率,CID_条件_控制型异常触发频率,1);
	小块结束填充(0);
	for (int i=0;i<6;i++)
		创建下拉列表(设置_HP范围+i,CID_条件_HP范围+i,i%3);
	小块结束填充(8);

	for (int i=0;i<10;i++)
		创建选择框(设置_机械怪物+i,CID_条件_机械怪物+i,i%3);
	小块结束填充(8);

	for (int i=0;i<8;i++)
		创建选择框(设置_普通敌人+i,CID_条件_普通敌人+i,i%3);
	小块结束填充(8);

	for (int i=0;i<13;i++)
		创建选择框(设置_自身出血状态+i,CID_条件_自身出血状态+i,i%3);
	小块结束填充(8);

	for (int i=0;i<13;i++)
		创建选择框(设置_怪物出血状态+i,CID_条件_怪物出血状态+i,i%3);
	小块结束填充(8);
}

void 重置设置_条件面板()
{
	UI_AdjustState++;
	ResetDropList(设置_场景,CID_条件_场景,PageId_Setting);
	ResetDropList(设置_怪物,CID_条件_怪物,PageId_Setting);
	for (int i=0;i<DNF药剂总数;i++)
		ResetCheckBox(设置_药剂1+i,CID_条件_药剂+i,PageId_Setting);

	for (int i=0;i<4;i++)
		ResetDropList(设置_出血触发频率+i,CID_条件_出血触发频率+i,PageId_Setting);
	for (int i=0;i<3;i++)
		ResetDropList(设置_出血层数+i,CID_条件_出血层数+i,PageId_Setting);
	ResetDropList(设置_控制型异常开关,CID_条件_控制型异常开关,PageId_Setting);
	ResetDropList(设置_控制型异常触发频率,CID_条件_控制型异常触发频率,PageId_Setting);
	for (int i=0;i<6;i++)
		ResetDropList(设置_HP范围+i,CID_条件_HP范围+i,PageId_Setting);

	for (int i=0;i<10;i++)
		ResetCheckBox(设置_机械怪物+i,CID_条件_机械怪物+i,PageId_Setting);

	for (int i=0;i<8;i++)
		ResetCheckBox(设置_普通敌人+i,CID_条件_普通敌人+i,PageId_Setting);

	for (int i=0;i<13;i++)
		ResetCheckBox(设置_自身出血状态+i,CID_条件_自身出血状态+i,PageId_Setting);

	for (int i=0;i<13;i++)
		ResetCheckBox(设置_怪物出血状态+i,CID_条件_怪物出血状态+i,PageId_Setting);

	选择场景冲突检查(GetIndexSetting(设置_场景));
	选择怪物冲突检查(GetIndexSetting(设置_怪物));

	//伤害详情页面的背景和条件有关，就放在这里初始化了
	CImage* Ctrl伤害详情背景=EasyFindControl<CImage>(PageId_DamageDetail,CID_伤害详情_底图);
	Ctrl伤害详情背景->SetImage(EasyLoadImageR(RID_伤害详情背景_修炼道场+GetIndexSetting(设置_场景)));
	//伤害详情页面下方的场景和怪物图标也在这里更新
	//场景后面标签对应的文本是系统奶，每次计算后由UpdateCalcResult()更新	
	CImage* Ctrl场景图标=EasyFindControl<CImage>(PageId_DamageDetail,CID_伤害详情_场景图标);
	Ctrl场景图标->SetImage(EasyLoadImageR(RID_场景图标+GetIndexSetting(设置_场景)));
	CImage* Ctrl怪物图标=EasyFindControl<CImage>(PageId_DamageDetail,CID_伤害详情_怪物图标);
	Ctrl怪物图标->SetImage(EasyLoadImageR(RID_怪物图标+GetIndexSetting(设置_怪物)));
	CLineLabel* Ctrl怪物标签=EasyFindControl<CLineLabel>(PageId_DamageDetail,CID_伤害详情_怪物标签);
	Ctrl怪物标签->SetText(怪物文本[GetIndexSetting(设置_怪物)]);

	//没有职业相关的初始化内容

	UI_AdjustState--;
}


void 退出清理_条件面板()
{


}